﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using BreukTrainer.Model;

namespace BreukTrainer
{
    public partial class Oefenen : Form
    {
        private DataTable breukenLijst;
        private BreukContainer breukContainer;

        public Oefenen()
        {
            InitializeComponent();
            breukenLijst = new DataTable();
            breukenLijst.Columns.Add("#");
            breukenLijst.Columns.Add("Breuk");
            breukenDataGridView.DataSource = breukenLijst;
            breukenDataGridView.Columns[0].Width = 20;
            breukenDataGridView.Columns[0].ReadOnly = true;
            breukenDataGridView.Columns[1].Width = 130;
            //breukContainer = new BreukContainer();
            breukContainer = new ProgrammeerbareBreukContainer();
            aantalBreukenUpDown.Value = 3; //meteen 3 breuken klaarmaken
        }


        private void breukenDataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {

            if (e.ColumnIndex == 1 && !e.FormattedValue.ToString().Equals(""))
            {

                breukenDataGridView.Rows[e.RowIndex].ErrorText = "";
                Regex breukPattern = new Regex("^(-)?[0-9]*\\/{1}(-)?[1-9]{1}[0-9]*$"); // 20 minuten van mijn dag weg!
                if (breukPattern.IsMatch(e.FormattedValue.ToString()))
                {
                    string[] operanden = e.FormattedValue.ToString().Split('/');
                    breukContainer[e.RowIndex].Teller = int.Parse(operanden[0]);
                    breukContainer[e.RowIndex].Noemer = int.Parse(operanden[1]);
                }
                else
                {
                    breukenDataGridView.Rows[e.RowIndex].ErrorText = "Ongeldig formaat. Breuken moeten in de vorm 1/2 worden ingetypt.";
                    e.Cancel = true;
                }
            }
        }

        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            decimal waarde = ((NumericUpDown)sender).Value;
            decimal verschil = breukenLijst.Rows.Count - waarde;

            if (verschil < 0) //Aantal breuken in de lijst verhogen
            {
                for (int i = 1; i <= Math.Abs(verschil); i++)
                {
                    breukenLijst.Rows.Add(breukContainer.Breuken.Count+1, "");
                    breukContainer.Add(new Breuk()); //voor elk element in de lijst een bijbehorende breuk hebben
                }
            }
            else
            {
                if (verschil > 0) //Aantal breuken in de lijst verlagen
                {
                    for (int i = breukenLijst.Rows.Count; i > waarde; i--)
                    {
                        breukenLijst.Rows[i - 1].Delete();
                        breukContainer.Breuken.RemoveAt(breukContainer.Breuken.Count - 1);
                    }
                }
            }
        }

        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            if (((RadioButton)sender).Checked)
            {
                breukenDataGridView.Enabled = true;
                breukenDataGridView.GridColor = SystemColors.ControlText;
                maakBreukenButton.Enabled = false;
            }
            else
            {
                breukenDataGridView.Enabled = false;
                breukenDataGridView.GridColor = Color.HotPink;
                maakBreukenButton.Enabled = true;
            }
        }

        private void maakBreukenButton_Click(object sender, EventArgs e)
        {
            if (radioButton2.Checked == true)
            {
                for (int i = 0; i < breukContainer.Breuken.Count; i++)
                {
                    breukContainer[i] = new Breuk(-80, 300, -80, 300);
                    ((DataRow)breukenLijst.Rows[i])[1] = breukContainer[i].Teller + "/" + breukContainer[i].Noemer;
                }
            }
            else
            {
                if (radioButton3.Checked == true)
                {
                    if (textBox1.Text.Trim().Length > 0 || textBox2.Text.Trim().Length > 0)
                    {
                        int num1, num2;
                        int.TryParse(textBox1.Text.Trim(), out num1);
                        int.TryParse(textBox2.Text.Trim(), out num2);

                        if (num1 <= num2)
                        {

                            for (int i = 0; i < breukContainer.Breuken.Count; i++)
                            {
                                breukContainer[i] = new Breuk(num1, num2, num1, num2);
                                ((DataRow)breukenLijst.Rows[i])[1] = breukContainer[i].Teller + "/" + breukContainer[i].Noemer;
                            }
                        }
                        else
                        {
                            MessageBox.Show("De ondergrens moet kleiner zijn dan de bovengrens.", "Ongeldige invoer",
                            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        }
                    }
                    else
                    {
                        MessageBox.Show("U moet een geldige boven- en ondergrens opgeven.", "Ongeldige invoer",
                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }
                }
            }
        }

        private void numeriekeTextBox_Validating(object sender, CancelEventArgs e)
        {
            double num;
            bool isNum = double.TryParse(((TextBox)sender).Text.Trim(), out num);

            if (!isNum)
            {
                MessageBox.Show("Gelieve enkel een numerieke waarde in te vullen.", "Ongeldige invoer",
                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                e.Cancel = true;
            }

        }

        // De tekstvelden bij breuken met beperkingen
        private void radioButton3_CheckedChanged(object sender, EventArgs e)
        {
            if (((RadioButton)sender).Checked)
            {
                textBox1.Enabled = true;
                textBox2.Enabled = true;
            }
            else
            {
                textBox1.Enabled = false;
                textBox2.Enabled = false;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(breukContainer.isGeldig().ToString());
            MessageBox.Show(breukContainer[2].ToString());
        }

    }
}
